2.6 switch语句

简介

C++语言提供了两种按照条件执行的语句:

  • if语句:根据条件决定控制流

  • switch语句:计算整型表达式的值,并根据这个值从几条执行路径中选择一条

switch语句

1. 例子:统计每个元音字母的数量

unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
char ch;
while (cin >> ch) {
    switch (ch) {
        case 'a':
            ++aCnt;
            break;
        case 'e':
            ++eCnt;
            break;
        case 'i':
            ++iCnt;
            break;
        case 'o':
            ++oCnt;
            break;
        case 'u':
            ++uCnt;
            break;
    }
}

2. case标签

  • case标签必须是整型常量表达式

  • 任意两个case标签的值不能相同

  • 如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,直到遇到break语句

  • 可以把多个case标签写在同一行内,强调这些case表示的是某个范围内的值

// 统计元音字母出现次数
unsigned vowelCnt = 0;
char ch;

while (cin >> ch) {
  	switch (ch) {
    	case 'a': case 'e': case 'i': case 'o': case 'u':
        	++vowelCnt;
        	break;
	}  
}

3. break

一般不要省略case分支最后的break语句,如果没写break语句,最好加一段注释说明程序的逻辑,否则可能带来非预期的结果。

4. default标签

Tips:标签不应该孤零零存在,它后面必须跟上一条语句或者另外一个case标签。如果switch结构以一个空的default标签作为接受,则该default标签后面必须跟上一条空语句或者一个空块。

如果没有任何一个case标签能匹配上switch表达式的值,那么程序将执行紧跟在default标签后面的语句:

// 统计元音字母和非元音字母出现次数
unsigned vowelCnt = 0;
unsigned otherCnt = 0;
char ch;

while (cin >> ch) {
  	switch (ch) {
    	case 'a': case 'e': case 'i': case 'o': case 'u':
        	++vowelCnt;
        	break;
        default:
            ++otherCnt;
            break;
	}  
}

4. switch内部的变量定义

switch的执行流程中可能会跨过某些case标签,如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而保证后面所有case标签都在变量的作用域之外:

case true:
	{
    	string file_name = get_file_name();
	}
	break;
case false:
	// 编译报错: file_name不在作用域之内
	if (file_name.empty())